package zhujie.demo04;

import java.lang.annotation.*;

/**
 * @author Mr.ma
 * @since 2022/10/26 15:17
 * 自定义注解高级篇：
 *      为自定义注解加上元注解，以及在注解中声明属性
 **/
@MyAnnPlus(value = "作用到类上")
public class Test04 {
    @MyAnnPlus(value = "作用在属性上", name = "法外狂徒")
    public String name;
    @MyAnnPlus(value = "作用在方法上")
    public void doSome(@MyAnnPlus(value = "作用在参数上", bwh = {48,36,45}) int[] bwh){
        System.out.println("bwh = " + bwh);
    }
}
/**
 * @author Mr.ma
 * 当只给注解中名为value的一个属性赋值时，属性名可省
 * 注解中的属性没有使用关键字default指定默认值时，在使用注解时必须给定属性值，反之可不指定
 * 注解中的属性只能是基本数据类型，String类型，枚举类型及这些类型对应的数组
 */
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface MyAnnPlus{
    String value();
    String name() default "张三";
    Sex sex() default Sex.UNDEFINED;
    int[] bwh() default {};
}
enum Sex{
    MAN,WOMAN,UNDEFINED
}